package main

import (
	"database/sql"
	"errors"
	"fmt"
	"homework/work2/task/dao"
)

/**
 * 我们在数据库操作的时候，比如 dao 层中当遇到一个 sql.ErrNoRows 的时候，是否应该 Wrap 这个 error，
 * 抛给上层。为什么，应该怎么做请写出代码？
 *
 * 列举了两种处理方式，个人倾向于第一种处理方式
 * 第一种方式调用者无需知道预定义错误值，减少了方法的暴露面
 */
func main() {
	//msg := getUserById("003")
	msg := getUserById2("002")

	fmt.Println(msg)
}

/**
 * 调用第一种处理方式
 * 对返回结果进行nil判等操作
 */
func getUserById(id string) string {
	user, err := loginDao.GetUserById(id)

	if err != nil {
		fmt.Println(err)
		return "服务器错误"
	}

	if user == nil {
		return "用户不存在或密码错误"
	}

	fmt.Printf("%s 登录成功\n", user.Name)
	return "登录成功！"
}

/**
 * 调用第二种处理方式
 * 调用者对预定义错误进行判断
 */
func getUserById2(id string) string {
	user, err := loginDao.GetUserById2(id)

	if err != nil && errors.Is(err, sql.ErrNoRows) {
		return "用户不存在或密码错误"
	}

	if err != nil {
		return "服务器错误"
	}

	fmt.Printf("%s 登录成功\n", user.Name)
	return "登录成功"
}
